/*
 * 1012. 带最小值操作的栈
 * 实现一个带有取最小值min方法的栈，min方法将返回当前栈中的最小值。
 * 你实现的栈将支持push，pop 和 min 操作，所有操作要求都在O(1)时间内完成。
 * 
 * 样例
 * 如下操作：push(1)，pop()，push(2)，push(3)，min()， push(1)，min() 返回 1，2，1
 * 
 * 2018.06.02 @jeyming
 * 
 */

package min_stack_1012;

import java.util.Stack;

class MinStack {
	/*
	 * 数组存储实现栈的操作
	 * 
	 */
//	public int top = -1;
//	public int[] objs;
//
//	MinStack() {
//		// do intialization if necessary
//		objs = new int[100];
//	}
//
//	/*
//	 * @param number: An integer
//	 * @return: nothing
//	 */
//	public void push(int number){
//		// write your code here
//		if(top<objs.length)
//			objs[++top]=number;
//	}
//
//	/*
//	 * @return: An integer
//	 */
//	public int pop() {
//		// write your code here
//		if(top!=-1)
//			return objs[top--];
//		return 0;
//	}
//
//	/*
//	 * @return: An integer
//	 */
//	public int min() {
//		// write your code here
//		int num=0;
//		if(top!=-1) {
//			num=objs[0];
//			for(int i=1;i<=top;++i) {
//				if(num>objs[i])
//					num=objs[i];
//			}
//		}
//		return num;
//	}
	public Stack<Integer> stackData;
	public Stack<Integer> minStackData;
	
	public MinStack() {
        // do intialization if necessary
		stackData = new Stack<>();
		minStackData = new Stack<>();
    }

    /*
     * @param number: An integer
     * @return: nothing
     */
    public void push(int number) {
        // write your code here
    	if(minStackData.isEmpty()||min()>number)
    		minStackData.push(number);
    	stackData.push(number);
    }

    /*
     * @return: An integer
     */
    public int pop() {
        // write your code here
    	int number = stackData.pop();
    	if(number == minStackData.peek())
    		minStackData.pop();
    	return number;
    }
    /*
     * @return: An integer
     */
    public int min() {
        // write your code here
    	return minStackData.peek();
    }
}

public class Min_stack_1012 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MinStack test = new MinStack();
		test.push(1);
		System.out.println(test.pop());
		test.push(2);
		test.push(3);
		System.out.println(test.min());
		test.push(1);
		System.out.println(test.min());
		
	}
}
